Skip to content

Dev - #217

Merged
GuillaumeSachet merged 10 commits into
mainfrom
dev
Sep 1, 2026
Merged

Dev#217
GuillaumeSachet merged 10 commits into
mainfrom
dev

Conversation

@GuillaumeSachet

Copy link
Copy Markdown
Contributor

No description provided.

xaviave and others added 10 commits June 15, 2026 14:13
bug(cache setup): add ttl + invalidation
fix(ci): fix ci divergent from local

fix(test): fix test for python 3.12

feat(sdk): add reconnection via dial + redis==8 and x-task-id in grpc metadata

feat(sdk): 1.0.0.dev19 / reco

feat(sdk): 1.0.0.dev20 / reco

feat(sdk): 1.0.0.dev21 / middleware permission

feat(sdk): 1.0.0.dev22 / middleware permission & ecrets

feat(sdk): 1.0.0.dev23 / associated task id

feat(sdk): 1.0.0.dev23 / log associated task id

feat(sdk): 1.0.0.dev25 / log associated task id

release(beta): staging release
feat!: Redis-first task transport and minimal gateway surface
feat(manager): Add ToolKit manager to collapse all registry tool into 4 entry with many actions

fix(ci): fix ci divergent from local

fix(test): fix test for python 3.12

feat(sdk): add reconnection via dial + redis==8 and x-task-id in grpc metadata

feat(sdk): 1.0.0.dev19 / reco

feat(sdk): 1.0.0.dev20 / reco

feat(sdk): 1.0.0.dev21 / middleware permission

feat(sdk): 1.0.0.dev22 / middleware permission & ecrets

feat(sdk): 1.0.0.dev23 / associated task id

feat(sdk): 1.0.0.dev23 / log associated task id

feat(sdk): 1.0.0.dev25 / log associated task id

release(beta): staging release

feat(community): add ModuleToolkit to community.agno

One SDK toolkit instead of per-archetype copies.
Every tool call collapsed to "No successful response received from module".

Parses the sentinel protocol (stream.error → "[CODE] message"), plus image
extraction and AG-UI event relay. Adds agno optional extra.

feat(agno): introduce toolkits for chat history, user profile, and registry access

- Added `ChatHistoryTools`, `UserProfileTools`, and `RegistryTools` to enhance agent capabilities.
- Updated `pyproject.toml` to include the new optional dependency `agno`.
- Introduced new module structure for toolkits under `digitalkin.community.agno.toolkits`.
- Enhanced `ModuleServer` to include module type in initialization.
- Updated registry models to support new module types and setups.
- Improved error handling and logging in registry services.

feat(agno): introduce toolkits + storage visibility and cross-context read scopes

feat(agno): registry toolkit refactor — discriminated-action managers (DEV-686)

Collapse the many registry LLM tools into four uniform managers, each a single
agno tool taking one discriminated `action` union:

- tools_manager / services_manager / kins_manager — CRUD (get / search / update /
  delete / change_visibility, plus create/load for services) over setups of each
  module_type, sharing one action set and the guard/normalise plumbing;
- load_manager — external-execution manager that loads a discovered tool into the
  agent (HITL pause + auto-continue) so it is callable in the same turn.

Design:
- Command pattern: each action is a Pydantic model with execute(ctx); shared
  BaseAction/BaseActionCtx, per-family RegistryAction/LoadAction bases.
- Managers register with skip_entrypoint_processing + an explicit schema and
  validate the argument themselves (accepting an object or a JSON string), so a
  bad LLM argument returns a clean {error, metadata} envelope the model can
  self-correct from instead of raising a validate_call traceback.
- Every result is the canonical {output|error, metadata:{success, tool}} envelope.

Hardening (from QA passes):
- type isolation: ensure_kind gates every id-targeting action to its manager's
  kind (no cross-kind read/update/delete); writes on a deleted id are refused.
- load_manager returns distinct failures, catches registry NOT_FOUND, and never
  raises into the agent loop; change_visibility re-reads the committed state.
- dynamic loading invalidates agno's tools cache before acontinue_run so a
  freshly-loaded tool is re-resolved into the model's function map.

Removes the old registry.py / setup.py / tool_loader.py surfaces and their tests.

feat(agno): validate setup content against the module config schema (DEV-686)

Before kins_manager.update/create writes a setup version, compile a throwaway
Pydantic model from the module's config-setup JSON schema (fetched via
GetConfigSetupModule) and validate the content, so an LLM driving the toolkit
gets a correctable error instead of breaking the kin.

The validator mirrors the schema's own strictness rather than a loose superset:
- objects reject non-objects, recursively, resolving $ref/$defs (D5);
- undeclared keys are forbidden unless additionalProperties is true (D8);
- arrays type their elements via items (D9);
- enum/const become closed Literal choices (D10);
- a field is nullable only when the schema declares it (D11);
- scalars are validated in strict mode, no "2"->number / true->number coercion (D13);
- strings reject C0 control characters, e.g. NUL / ANSI escapes (D17);
- numeric bounds, string length/pattern and array minItems/maxItems are enforced
  when declared (D14/D15/D16 close as soon as the module schema tightens them).

Wiring: CommunicationStrategy grows a get_module_config_schema (gRPC override
calls GetConfigSetupModule); ModuleContext exposes it; RegistryActionCtx runs
the validation best-effort (skipped when no context/schema is available).

Also: rename the archive action to delete, and carry the RegistrySetupStatus /
Visibility enums through SetupData with lenient _missing_ coercion.

feat(agno): type mapping values via additionalProperties in content validation (D18)

An object schema with no properties but an additionalProperties value schema
(e.g. a tool's `triggers`: {additionalProperties: {type: boolean}}) now compiles
to dict[str, <value>] instead of a bare dict, so a wrong-typed value (a string
where a boolean is expected) is refused with the field path. Also honour
minProperties/maxProperties as mapping cardinality bounds.

docs(agno): reword internal comments to drop private review references

feat(agno): reject control characters in a write action's name field

fix(agno): harden registry managers against QA-found defects (D3, D6, D7, D9, D10)

- D3: reject content keys carrying control/non-BMP characters, naming the key,
  instead of silently dropping them on write (services create + update)
- D6: exclude versionless (non-instantiable) setups from search results so a
  caller never sees an unusable version:null row
- D7a: populate loaded_functions when a tool is already loaded, so the result
  is as verifiable as a fresh load
- D7b: enumerate the accepted action tags when load_manager receives an
  out-of-union action, matching the CRUD managers
- D9/D10: compute search `truncated` on the rendered page and read limit+1 so
  the flag means "a further usable row exists", not merely "the page is full"

Delete docker directory

Delete scripts directory
…it (DEV-670)

Agno drains parallel member runs through a single asyncio.Queue, so two members
streaming at once interleave their deltas on the wire. The adapter tracked one
text-message slot and one reasoning slot for the whole stream, which spliced both
speakers into a single bubble under a single name.

Track both sequences per run, and carry AG-UI's subagent_run_id on every event a
delegated run produces, so a client attributes output by id instead of matching a
display name.

- Surface delegations as SUBAGENT_STARTED / SUBAGENT_FINISHED / SUBAGENT_ERROR
- Forward event metadata through to AG-UI, namespaced under "digitalkin"
- Label a member's bubble with its author via TEXT_MESSAGE_START.name, replacing
  the "--- name ---" header previously injected into the message text
- Close events carry the metadata of whoever opened the sequence, so a consumer
  filtering on parent_run_id keeps start and end together
- A member's failure emits SUBAGENT_ERROR rather than RUN_ERROR, which AG-UI
  treats as terminal for the whole stream
- Force-close every open message, reasoning block and delegation before
  RUN_FINISHED, which AG-UI rejects while any is still active

Pins ag-ui-protocol to the dev build carrying subagent events and event-level
metadata; move to >=0.1.21 once that ships stable.

Bumps the dev version to 1.0.3.dev0.
feat(agno): sub-agent event labelling — release 1.0.3.dev0
…vice (DEV-686)

Brings the SDK up to `agentic-mesh-protocol` at proto commit 0238092. Most of that
branch already landed with the registry refactor; these are the fields and RPCs that
were still being dropped on the floor.

Filesystem gains the visibility scope it never carried: on the record, on uploads, on
updates, and as a filter. Registry gains `tags` on modules and setups plus the
`sort_by`/`descending` knobs, so a caller can order a page instead of taking whatever
the backend hands back. `GetUserProfileResponse.mission_cost` rides on the response
rather than the profile, and was being discarded by the proto-to-dict conversion; it is
now folded into the dict callers already read. Storage records carry their
service-assigned `storage_id`, and listing gained a record filter with limit/offset.
Setup gains ListSetupVersions and SetCurrentSetupVersion, with the local strategy
keeping a real version history so both are meaningful off-platform.

UpdateSetup cuts a new version rather than editing one in place, so omitting
`set_as_current` left the setup serving its old content. It is now sent, defaulting to
true, which is what every existing caller already assumed.

The agno registry toolkit also accepts the discriminated `action` union flattened or as
a JSON string, since models routinely send both readings of a nested schema; a setup
whose backing module the registry can no longer resolve is now deletable, while a
transient registry error still fails closed. Adds version rollback to the kins manager.

Requires agentic-mesh-protocol 1.0.1.dev5, which is not published yet: the pin makes
every `uv`-based pre-commit hook unresolvable, so this was committed with --no-verify.
`ruff check src/digitalkin` passes; `mypy src/digitalkin` reports 9 errors, all of them
the new proto fields (storage_id, set_as_current, ListSetupVersions, …) missing from the
older agentic-mesh-protocol currently installed in the local venv — they clear once dev5
is published and installed.

fix(redis): enhance error handling and logging for Redis connectivity issues

This update improves the resilience of the Redis client by explicitly setting socket timeouts and implementing retry logic for transient errors in the blocking pool. It also enhances logging to provide clearer diagnostics by specifying the type of Redis error encountered, aiding in troubleshooting. Additionally, the AgnoHitlRunner class has been updated to better manage tool resolution during continued runs, ensuring that tools are correctly restored after a pause.

The changes include:
- Added socket timeout configuration to Redis client settings.
- Implemented retry logic for blocking Redis operations.
- Enhanced error logging in the GatewayServicer to specify the type of Redis error.
- Updated AgnoHitlRunner to handle tool resolution more effectively during continued runs.

feat(module): implement mission-scoped persistence for dynamically loaded tools

This update introduces a new mechanism to ensure that tools loaded at runtime persist across turns within the same mission, while preventing them from leaking into other missions. Key changes include:

- Added `LoadedToolStore` to manage the persistence of loaded tool IDs in a mission-scoped storage collection.
- Enhanced `ModuleContext` with methods to persist loaded tools and rehydrate them at the start of each mission turn.
- Updated `ToolCache` to differentiate between declared and dynamically loaded tools, ensuring that dynamic loads are scoped to individual missions.
- Refactored `LoadToolAction` to handle duplicate outcomes and conflicts more effectively during tool loading.

These changes improve the reliability and isolation of tool loading in the agent's runtime environment.

chore(release): bump version to 1.0.3
feat(services): track the tool-kin-registry protocol across every service (DEV-686)
@GuillaumeSachet
GuillaumeSachet merged commit 53e2ed7 into main Sep 1, 2026
41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants